#ifndef INODO_H
#define INODO_H

#include <list>
#include "IBloque.h"
#include "IRegistro.h"
#include "Resultados.h"


class INodo : public IBloque {
	protected:
		std::list<IRegistro*> lRegistros;

		// Construye un separador entre este nodo y el nodo "n"
		virtual IRegistro& construirRegistroDivisor(INodo& n) = 0;

		// Devuelve un iterador donde hay que realizar la insercion del registro
		Resultado buscarPosicion(IRegistro* reg, std::list<IRegistro*>::iterator &it);

		// Devuelve la cantidad de registros que se deben dejar en este nodo al hacer el split
		int dividirRegistros() const;

		// Devuelve el tamaño en bytes de los datos contenidos
		size_t getBytes() const;

	public:
		INodo();
		virtual ~INodo();

		// Indica cual es el estado del nodo
		Resultado getEstado() const;

		// Las operaciones sobre los registros contenidos en el nodo
		Resultado agregarRegistro(IRegistro* reg);
		Resultado quitarRegistroPorId(const IRegistro& reg);
		Resultado modificarRegistroPorId(IRegistro* reg);
		const IRegistro& buscarRegistroPorId(const IRegistro& reg, bool busquedaExacta = true) const;

		virtual IRegistro& splitNodo(INodo& nodo);
		virtual IRegistro& mergeNodo(INodo& nodo);

		// El tamaño en bytes de todo el nodo
		virtual size_t getSize() const = 0;

		// Elimina todo el contenido del nodo
		virtual void clear();
};


#endif
